package com.houger.ddd.common.config;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpRejectAndDontRequeueException;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;

import java.util.Map;

/**
 * @author Houger.
 * @date 2024年05月28日 10:52.
 */
@Slf4j
@Configuration
public class RabbitMQConfig implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void initRabbitTemplate(){
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnsCallback(this);
    }
    @Override
    public void confirm(final CorrelationData correlationData, final boolean b, final String s) {
        log.debug("confirm(): {},{},{}",correlationData,b,s);
        if (!b){
            // 根据需要进行操作，如落库，重发，记录日志等
            log.error("confirm ack is false");
        }

    }

    @Override
    public void returnedMessage(final ReturnedMessage returnedMessage) {
        log.debug("returnedMessage(): {}",returnedMessage);
    }

//    /**
//     * 次方法会影响延迟消息
//     * @Retryable注解表示该方法需要进行重试，其中
//     * value属性指定了需要重试的异常类型，
//     * maxAttempts属性指定了最大重试次数，
//     * backoff属性指定了重试间隔时间。
//     * 在retryMessage()方法中，使用rabbitTemplate发送消息到指定的交换器和路由键。
//     * @date 2024/5/29 15:14
//     * @param returnedMessage
//     */
//    @Retryable(retryFor = {AmqpRejectAndDontRequeueException.class}, maxAttempts = 3, backoff = @Backoff(delay = 5000))
//    public void retryMessage(final ReturnedMessage returnedMessage) {
//        log.debug("retryMessage(): {}",returnedMessage);
//        rabbitTemplate.send(returnedMessage.getExchange(), returnedMessage.getRoutingKey(), returnedMessage.getMessage());
//    }

}
